<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>promise</title>
</head>
<body>
<script>
    //promise 异步解决方案   承诺 表示未来的某一个时间 承诺返回数据给你
    //promise是一个异步的操作

    // ===>回调地狱
    //业务复杂度提高
    //代码可读性差
/*    $.ajax({
        url: 'A地址',
        success: function () {
            $.ajax({
                url: 'B地址',
                success: function () {
                    $.ajax({
                        url: 'C地址',
                        success: function () {
                            $.ajax({})
                        }
                    })
                }
            })
        },
        error: function () {

        },
    })*/

    //使用Promise可以用then()方法将异步操,以同步操作的方式表示出来.
    //*一个Promise对象就标识一个异步操作

    //Promise
    //pending(进行中) fulfilled(已成功) rejected(已失败)
    //状态变化过程是固定的.
    //pending --->fulfilled(已成功)
    //pending --->rejected(已失败)
    //一旦状态被改变之后,将不会发生变化


    {
        let p = new Promise(function (resolve, reject) {
//            resolve 成功后的回调
//            reject 失败后的回调
            resolve();//==>异步   成功
            reject();
            console.log("flag---->", 1)
        });
//        p.then(成功后的回调函数[,失败后的回调函数])
        p.then(
            success => {
                console.log("flag---->success", 2)
            },
            err => {
                console.log("flag---->", 22)
            }
        );
        p.then(
            success => {
                console.log("flag---->success", 2222)
            }
        );

        console.log("flag---->", 3)
        //返回  1 3 2
    }

    {//回调地狱
        let fn1 = () => {
            return new Promise((resolve, reject) => {
                setTimeout(() => {
                    resolve();
                    console.log("A")
                }, 3000)
            })
        };
        let fn2 = fn1().then(
            success => {
                return new Promise((resolve, reject) => {
                    setTimeout(() => {
                        resolve();
                        console.log("B")
                    }, 3000)
                })
            });
        fn2.then(
            success => {
                console.log("C");
            }
        )
    }

    {
        //catch()
        let profn=(num)=>{
            return new Promise((resolve, reject)=>{
                if(num>0){
                    resolve("大于0的数字")
                }else {
                    throw new Error("模拟代码错误....")
                }
            })
        };
        profn(1).then(
            success=>{
                console.log("success",success);
//                throw new Error("模拟代码错误----2....")
            },
            err=>{
                console.log("err====>", err)
            }
        ).catch(
            cat =>{
                console.log("catch===>", cat)
            }
        ).finally(
            fina=>{
                console.log("finally")
            }
        );

/*        function fn() {
            try {

            }catch {

            }finally {

            }
        }*/




    }
    /*
    * Promise对象代表一个异步操作.表示一个预计在未来完成的异步操作
    * 三种状态 pending(进行中) fulfilled(已成功) rejected(已失败)
    * 状态发生改变之后是不可逆的(凝固),一旦状态发生改变之后就会一直保持这种状态,不会再发生任何改变.
    * pending--->fulfilled/rejected
    * 一旦状态改变后.promise.then()方法就会被调用
    * */



</script>
</body>
</html>